#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int main() 
{
    // 环境变量的指针声明
    extern char** environ;  

    printf("我是父进程，我的pid：%d\n", getpid());
    pid_t id = fork();
    if(id == 0)
    {
        // child
        // 让子进程执行全新的程序
        printf("我是子进程，我的pid:%d\n", getpid());
        char *const env_[] = {
            (char*)"MYPATH=YouCanSeeMe!",
            NULL
        };
        // e:添加环境变量给目标进程，是覆盖式的
        execle("./mycmd", "mycmd", NULL, environ); 
        //execl("/home/hb/code/9_29_18/mycmd", "mycmd", NULL);
//        char *const argv_[] = {
//            (char*)"ls",
//            (char*)"-a",
//            (char*)"-l",
//            (char*)"-i",
//            NULL
//        };
//        execvp("ls", argv_);
//        //execlp("ls", "ls", "-a", "-l", NULL); // 这里出现了两个ls，含义不同
//        // execv("/usr/bin/ls", argv_);
//        //execl("/usr/bin/ls", "ls", "-a", "-l", NULL); // 不带选项
        exit(1); // 只要执行了exit，意味着，execl系列的函数失败了
    }
    // 一定是父进程
    int status = 0;
    int ret = waitpid(id, &status, 0);
    if(ret == id)
    {
        sleep(2);
        printf("父进程等待成功!\n");
    }

    //int ret = execl("/usr/bin/qwert", "top", NULL); // 不带选项
    //execl("/usr/bin/ls", "ls", "-l", "-a", NULL); // 带选项
    //execl("/usr/bin/ls", "top", NULL); // 不带选项

    // printf("我执行完毕了，我的pid是：%d, ret：%d\n", getpid(), ret);
   

    return 0;
}
